perm filename PIGEON[EKL,SYS]3 blob
sn#822559 filedate 1986-08-14 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00005 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 the pigeon hole principle
C00003 00003 * using the inductive predicate `all' the theorem comes quickly
C00013 00004 the arithmetical pigeon hole principle: long proof
C00018 00005 the pigeon hole principle on lists
C00038 ENDMK
C⊗;
;the pigeon hole principle
(wipe-out)
(get-proofs mult prf ekl sys)
(proof pigeonfacts)
;the arithmetical form of the pigeon hole principle
(axiom |∀f n.(∀m.m≤n⊃natnum f(m))∧(∀m.m<n⊃1≤f(m))∧sum(λk.f(k),n)≤n⊃(∀m.m<n⊃1=f(m))|)
(label pigeonfact)
;the pigeon hole principle on lists
(axiom |∀setseq u.disjoint(setseq,length u)∧
(∀k.k<length u⊃1≤mult(u,setseq(k)))⊃
(∀k.k<length u⊃1=mult(u,setseq(k)))|)
(label pigeonlist)
(save-proof pigeon)
;* using the inductive predicate `all' the theorem comes quickly;
(wipe-out)
(get-proofs sums prf ekl sys)
(proof pigeonfact)
1. (assume |∀n.natnum f(n)|)
(label sort1)
2. (ue ((numseq.|λk.f(k)|)(n.n)) sumsort *)
;NATNUM(SUM(λK.F(K),N))
(label sort2)
3. (ue (a |λn.all(n,λk.1≤f(k))⊃n≤sum(λk.f(k),n)|)
proof_by_induction
(open all sum) zeroleast (use sort1 sort2 mode: always)
(use add_lesseq ue: ((n.n)(k.|f(n)|)(m.|sum(λk.f(k),n)|)) ))
(label strictly_increasing)
;∀N.ALL(N,λK.1≤F(K))⊃N≤SUM(λK.F(K),N)
;deps: (SORT1)
4. (ue (a |λn.all(n,λk.1≤f(k))∧sum(λk.f(k),n)=n⊃all(n,λk.1=f(k))|)
proof_by_induction (open all sum) strictly_increasing sort1 sort2
(use add_one ue: ((k.|f(n)|)(n.n)(m.|sum(λk.f(k),n)|)) mode: always))
;∀N.ALL(N,λK.1≤F(K))∧SUM(λK.F(K),N)=N⊃ALL(N,λK.1=F(K))
;in more conventional notation:
5. (rw * (use allfact ue: ((a.|λk.1≤f(k)|)(n.n))
mode: always direction: reverse)
(use allfact ue: ((a.|λk.1=f(k)|)(n.n))
mode: always direction: reverse))
;∀N.(∀M.M<N⊃1≤F(M))∧SUM(λK.F(K),N)=N⊃(∀M.M<N⊃1=F(M))
;deps: (SORT1)
6. (ci sort1)
;(∀N.NATNUM(F(N)))⊃
;(∀N.(∀M.M<N⊃1≤F(M))∧SUM(λK.F(K),N)=N⊃(∀M.M<N⊃1=F(M)))
;;;;;;
; (axiom |∀numseq n.all(n,λm.natnum(numseq(m)))⊃natnum(sum(numseq,n))|)
; (label sumsort1)
;
; 1. (ue (a |λn.all(n,λk.natnum f(k))∧all(n,λk.1≤f(k))⊃
; natnum sum(λk.f(k),n)∧n≤sum(λk.f(k),n)|)
; proof_by_induction
; (open all sum) zeroleast sumsort1
; (use add_lesseq ue: ((n.n)(k.|f(n)|)(m.|sum(λk.f(k),n)|)) ))
; 1. ;∀N.ALL(N,λM.NATNUM(F(M)))∧ALL(N,λK.1≤F(K))⊃N≤SUM(λK.F(K),N)
; (label strictly_increasing)
;
; ;doesn't work
; 2. (ue (a |λn.all(n,λk.natnum f(k))∧all(n,λk.1≤f(k))∧sum(λk.f(k),n)=n⊃
; all(n,λk.1=f(k))|)
; proof_by_induction (open all sum)
; (use strictly_increasing sumsort1 mode: always)
; (use add_one ue: ((k.|f(n)|)(n.n)(m.|sum(λk.f(k),n)|)) mode: always))
;
;the arithmetical pigeon hole principle: long proof
(wipe-out)
(get-proofs sums prf ekl sys)
(proof pigeonfact)
1. (assume |(∀m.m<n⊃natnum f(m)∧1≤f(m))⊃n≤sum(λk.f(k),n)|)
(label si_indhyp)
2. (assume |∀m.m<n'⊃natnum f(m)∧1≤f(m)|)
(label si_hyp)
3. (trw |∀m.m<n⊃natnum f(m)∧1≤f(m)| (* transitivity_of_order successor1))
;∀M.M<N⊃NATNUM(F(M))∧1≤F(M)
(label si1)
4. (ue ((numseq.|λk.f(k)|)(n.n)) sumsort *)
;NATNUM(SUM(λK.F(K),N))
(label sisort)
5. (derive |n≤sum(λk.f(k),n)|(si1 si_indhyp))
(label si2)
6. (ue (m n) si_hyp successor1)
;NATNUM(F(N))∧1≤F(N)
(label si3)
;deps: (SI_HYP)
7. (ue ((n.n)(k.|f(n)|)(m.|sum(λk.f(k),n)|)) add_lesseq (sisort si2 si3))
;N'≤SUM(λK.F(K),N)+F(N)
;deps: (SI_INDHYP SI_HYP)
8. (ci si_hyp)
;(∀M.M<N'⊃NATNUM(F(M))∧1≤F(M))⊃N'≤SUM(λK.F(K),N)+F(N)
;deps: (SI_INDHYP)
9. (ci si_indhyp)
;((∀M.M<N⊃NATNUM(F(M))∧1≤F(M))⊃N≤SUM(λK.F(K),N))⊃
;((∀M.M<N'⊃NATNUM(F(M))∧1≤F(M))⊃N'≤SUM(λK.F(K),N)+F(N))
10. (ue (a |λn.(∀m.m<n⊃natnum f(m)∧1≤f(m))⊃n≤sum(λk.f(k),n)|) proof_by_induction
(open sum) zeroleast (use * mode: always))
;∀N.(∀M.M<N⊃NATNUM(F(M))∧1≤F(M))⊃N≤SUM(λK.F(K),N)
(label strictly_increasing)
;other direction
11. (assume |(∀m.m<n⊃natnum f(m)∧1≤f(m))∧sum(λk.f(k),n)=n⊃(∀m.m<n⊃1=f(m))|)
(label pfindhyp)
12. (assume |∀m.m<n'⊃natnum f(m)∧1≤f(m)|)
(label pf_assume)
13. (derive |∀m.m<n⊃natnum f(m)∧1≤f(m)| (pf_assume transitivity_of_order successor1))
(label pf0)
14. (ue ((numseq.|λk.f(k)|)(n.n)) sumsort *)
;NATNUM(SUM(λK.F(K),N))
(label pfsort)
;deps: (PF_ASSUME)
15. (derive |natnum f(n)∧1≤f(n)| (pf_assume successor1))
(label pf1)
;deps: (PF_ASSUME)
16. (assume |sum(λk.f(k),n')=n'|)
(label pf_assume)
17. (rw * (open sum))
;SUM(λK.F(K),N)+F(N)=N'
(label pf2)
;deps: (PF_ASSUME)
;the case of f(n)
18. (derive |n≤sum(λk.f(k),n)| (strictly_increasing pf0 pfsort))
(label pf3)
;deps: (PF_ASSUME)
;use
;labels: ADD_ONE
;(AXIOM |∀K N M.1≤K∧N'=M+K∧N≤M⊃1=K∧N=M|)
19. (ue ((k.|f(n)|)(n.n)(m.|sum(λk.f(k),n)|)) add_one
(pf1 pf2 pf3 pfsort))
;1=F(N)∧N=SUM(λK.F(K),N)
(label pf4)
;deps: (PF_ASSUME)
;use the induction hypothesis
20. (derive |∀m.m<n⊃1=f(m)| (pfindhyp pf0 *))
(label pf5)
;deps: (PF_ASSUME PFINDHYP)
21. (derive |n0=n⊃1=F(n0)| pf4)
;deps: (PF_ASSUME)
22. (trw |∀m.m<n'⊃1=f(m)| (use less_succ_lesseq mode: exact)
(open lesseq) (use normal mode: always) pf5 *)
;∀M.M<N'⊃1=F(M)
;deps: (PF_ASSUME PFINDHYP)
23. (ci pf_assume)
;(∀M.M<N'⊃NATNUM(F(M))∧1≤F(M))∧SUM(λK.F(K),N')=N'⊃(∀M.M<N'⊃1=F(M))
;deps: (PFINDHYP)
24. (ci pfindhyp)
25. (ue (a |λn.(∀m.m<n⊃natnum f(m)∧1≤f(m))∧sum(λk.f(k),n)=n⊃(∀m.m<n⊃1=f(m))|)
proof_by_induction *)
;∀N.(∀M.M<N⊃NATNUM(F(M))∧1≤F(M))∧SUM(λK.F(K),N)=N⊃(∀M.M<N⊃1=F(M))
26. (trw |∀f n.(∀m.m<n⊃natnum f(m)∧1≤f(m))∧sum(λk.f(k),n)=n⊃(∀m.m<n⊃1=f(m))| *)
;∀F N.(∀M.M<N⊃NATNUM(F(M))∧1≤F(M))∧SUM(λK.F(K),N)=N⊃(∀M.M<N⊃1=F(M))
;the pigeon hole principle on lists
(wipe-out)
(get-proofs pigeon prf ekl sys)
(proof pigeonlist)
;a fix
(ue (a |λn.natnum sum(λm.mult(u,setseq m),n)|) proof_by_induction (open sum))
;∀N.NATNUM(SUM(λM.MULT(U,SETSEQ(M)),N))
1. (assume |disjoint(setseq,length u)|)
(label pl1)
;multiplicity less than length
2. (ue ((u.u)(a.|un(setseq,length u)|)) length_mult)
;MULT(U,UN(SETSEQ,LENGTH U))≤LENGTH U
(label pl2)
3. (derive |sum(λm.mult(u,setseq(m)),length u)≤length u|
(mult_of_un_is_sum_mult pl1 pl2))
(label pl3)
4. (ue ((f.|λm.mult(u,setseq(m))|)(n.|length u|)) pigeonfact pl3 multfact)
;(∀M.M<LENGTH U⊃1≤MULT(U,SETSEQ(M)))⊃(∀M.M<LENGTH U⊃1=MULT(U,SETSEQ(M)))
;deps: (PL1)
;the pigeon hole principle on lists
5. (ci pl1)
;DISJOINT(SETSEQ,LENGTH U)⊃
;((∀M.M<LENGTH U⊃1≤MULT(U,SETSEQ(M)))⊃(∀M.M<LENGTH U⊃1=MULT(U,SETSEQ(M))))